/*
 * @lc app=leetcode.cn id=3 lang=java
 *
 * [3] 无重复字符的最长子串
 */

// @lc code=start
class Solution {
    /**
     * 这写法真的挺巧妙，双指针加打表法，如果不开int数组存放每个符号的使用次数
     * 就得用hashmap<char,int>来记录了。
     * @param s
     * @return
     */
    public int lengthOfLongestSubstring(String s) {
        int[] map = new int[128];//初始化为0了，这也是很常见的打表的方法
        int len =s.length();
        int max = 0;
        for(int i =0 ,j=0;j<len;j++){//双指针法，非常妙
            map[s.charAt(j)]++;
            while(map[s.charAt(j)]>1){//说明j指着的地方和i指着的地方是相同的,其实最多是2
                map[s.charAt(i++)]--;//i指针后移，同时将其map值减一
            }
            if(j-i+1>max){
                max = j-i+1;
            }

        }
        return max;

    }
}
// @lc code=end

